#include "vofadebug.h"
#include "stm32f10x_conf.h"
#include "stm32f10x.h"
#include "DMA_STM32F10x.h"
#include "delay.h"

#define SEND_BUF_SIZE 8	//发送数据长度,最好等于待发送数据大小的整数倍.
u8 SendBuff[SEND_BUF_SIZE];	//发送数据缓冲区

//DMA1 的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8 位数据宽度/存储器增量模式
//DMA_CHx:DMA 通道 CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量

DMA_InitTypeDef DMA_InitStructure;

u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度 	    
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHx:DMA通道CHx
//cmar:存储器地址
//cndtr:数据传输量 小车发送速度
void VofaDebugInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能USART2，GPIOA时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	//USART2_TX   GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
  
    //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;          //串口输入PA3                                                                              
  	//GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;//浮空输入
  	//GPIO_Init(GPIOA,&GPIO_InitStructure);       			 //初始化串口输出
   
  	//中断开启设置
	//USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);									//开启检测串口空闲状态中断
	//USART_ClearFlag(USART2,USART_FLAG_TC);											//清除USART2标志位


   //Usart1 NVIC 配置
   //NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
   //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4 ;//抢占优先级3
   //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
   //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
   //NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = 115200;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Tx;	//发模式

  USART_Init(USART2, &USART_InitStructure); //初始化串口2
  USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断
  USART_Cmd(USART2, ENABLE);                    //使能串口12
    //DMA初始化
 	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//使能DMA传输
	delay_ms(10);
    DMA_DeInit(DMA1_Channel7);   //将DMA的通道7寄存器重设为缺省值

	DMA1_MEM_LEN=SEND_BUF_SIZE;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DR);  //USART2数据发送寄存器
	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;  //DMA内存基地址这里给速度变量的地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向，从内存读取发送到外设
	DMA_InitStructure.DMA_BufferSize = SEND_BUF_SIZE;  //DMA通道的DMA缓存的大小
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在x\循环模Circular
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
	DMA_Init(DMA1_Channel7, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART2_Tx_DMA_Channel所标识的寄存器
	
  //DMA1通道7 NVIC 配置
	//NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;				//NVIC通道设置
	//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;				//抢占优先级
	//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;						//子优先级
	//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//IRQ通道使能
	//NVIC_Init(&NVIC_InitStructure);											//根据指定的参数初始化NVIC寄存器

	//DMA_ITConfig(DMA1_Channel7,DMA_IT_TC,ENABLE);							//开USART2 Tx DMA中断

	DMA_Cmd(DMA1_Channel7,DISABLE);           								//使DMA通道7停止工作
	USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);        					//开启串口DMA发送

	DMA_Cmd(DMA1_Channel7, ENABLE);				//开始DMA发送

} 



u8 USART2_TX_FLAG=1;

u8 data_tail[4] = {0x00,0x00,0x80,0x7f};//帧尾占32位

u8* SendBuffPointer = (u8*)SendBuff;
u8* data_tail_pointer = data_tail;
//开启一次DMA传输

/// @brief 发送一个浮点数
/// @param DATE_TO_SEND 地址
void VofaSend(float* DATE_TO_SEND)
{
    u8* DATE_TO_SEND_pointer = (u8*)DATE_TO_SEND; 
    for (u8 i = 0; i < 4; i++)
    {
        *(SendBuffPointer+i) = *(DATE_TO_SEND_pointer+i);
    }
    for (u8 i = 0; i < 4; i++)
    {
        *(SendBuffPointer+4+i) = *(data_tail_pointer+i);
    }

    if(DMA_GetFlagStatus(DMA1_FLAG_TC7)!=RESET)
  {
    DMA_ClearFlag(DMA1_FLAG_TC7);//清除通道4传输完成标志
     DMA_Cmd(DMA1_Channel7, DISABLE);				//关闭DMA发送
	DMA1_Channel7->CMAR  = (uint32_t)SendBuff;	//设置要发送的数据地址
	DMA1_Channel7->CNDTR = SEND_BUF_SIZE;    			//设置要发送的字节数目
	DMA_Cmd(DMA1_Channel7, ENABLE);				//开始DMA发送
  
  } 
    

}	  



    